{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#Kivy指南"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "作者：[Mark Vasilkov](https://github.com/mvasilkov)\n",
    "\n",
    "中文译者：[Tao Junjie](https://github.com/muxuezi)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##前言"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "移动应用开发几年前就是热点了，现在是个软件用户就想要移动版。桌面操作系统也受到影响，跨平台的软件成为新常态。甚至通常局限于微软桌面操作系统的游戏开发者也开始找一些Mac和Linux平台上的工作了（比如Steam，目前有Mac游戏近4000个，SteamOS+Linux游戏2000多个）。\n",
    "\n",
    "这对新手和个人开发者是大利好：跨平台的支持可以增加用户，销售量自然会更好。\n",
    "\n",
    "但是，写可移植的软件是非常耗费资源的过程，对小公司和个人开发者的影响比大公司更甚。\n",
    "\n",
    "尤其是许多平台都有不同语言的SDK：iOS用Objective-C和Swift，Android用Java，MS用.Net，更多是C#来开发软件。\n",
    "\n",
    "使用这些工具可以通过系统功能来制作相应的原生应用，但是跨平台的代码重用变得十分困难。就算你精通所有语言和相关的操作，代码的移植仍然是一件复杂的事情。\n",
    "\n",
    "<!-- TEASER_END-->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##一次编写，到处运行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因此，统一多平台支持开发工具呼之欲出。无独有偶，1995年的Sun公司就为解决类似问题发明了Java。其口号为“Write once, run anywhere”（一次编写，到处运行，WORA），虽然Java已经20年了，很多人都在各种纪念。但是其啰嗦的代码仍然没能实现当年的豪言壮语，一些程序员的改编版本更能表达人们的感受——“write once, run away”（一次编写，到处跑偏），有一些放弃Java转向了更好的程序语言，比如Python。\n",
    "\n",
    "本书主题Kivy是一个图形用户界面（graphical user interface，GUI）工具用来轻松创建跨平台的Python应用。其主要特征如下：\n",
    "\n",
    "- **兼容性**：Kivy支持多平台，包括Windows，MacOS，Linux，Android和iOS，均出自一个工具\n",
    "- **原生界面**：Kivy填补了不同输入方式间的缝隙，允许你用相同的代码处理不同的输入方式，包括鼠标和触摸屏\n",
    "- **快速图形硬件加速**：OpenGL渲染让Kivy可以胜任图形需求高的应用，如视频游戏，还可以通过平滑变换改善用户体验\n",
    "- **使用Python开发**：Kivy的app是用Python写的，轻松简单，可移植性良好，Python的标准库和[PyPI](https://pypi.python.org/pypi)第三方丰富模块都可以使用\n",
    "\n",
    "Kivy可以看作许多模块的超集：许多知名的模块如Pygame，SDL，GStreamer都是Kivy的组成部分。但是，Kivy的API更加高级、统一，方便使用。\n",
    "\n",
    "Kivy是开源的，其源代码在[GitHub上](https://github.com/kivy/kivy)。你可以fork一下，帮忙打补丁，也可以增加新特性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##本书内容简介"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本书分9章。\n",
    "\n",
    "- [*第1章，时钟app*](kivy-ch1-clock-app.html)对Kivy应用开发做简要介绍。包括Kivy语言、布局、部件和计时器。本章会做一个时钟app，与手机上的时钟应用类似\n",
    "- [*第2章，画图app*](kivy-ch2-paint-app.html)对Kivy框架的部件和功能进一步挖掘。通过制作画图app学习自定义部件，在画布上画任意形状，处理多点触控事件等\n",
    "- [*第3章，Android录音app*](kivy-ch3-sound-recorder-for-android.html)是用Kivy开发一个Android应用。通过Pyjnius模块实现Python与Java的交互，调用Android的API来实现Kivy用户界面\n",
    "- [*第4章，聊天app*](kivy-ch4-chat-app.html)介绍Kivy的网络应用开发，用Python写一个简单通信协议，利用Twisted框架建立服务器-客户端模型，实现一个Kivy聊天app\n",
    "- [*第5章，远程桌面app*](kivy-ch5-remote-desktop-app.html)用另一种方式写服务器-客户端应用。这章通过HTTP协议来构建模型。首先建立命令行模式的HTTP服务器，然后再用Kivy实现远程桌面app\n",
    "- [*第6章，2048 app*](kivy-ch6-2048-app.html)是实现一个2048游戏。我们将演示Kivy更复杂的功能，用Kivy属性实现数据绑定和触摸手势处理来创建自定义部件\n",
    "- [*第7章，飞翔的小鸟app*](kivy-ch7-flappy-bird-app.html)是另一个Kivy游戏，实现著名的Flappy Bird游戏。我们会学习纹理坐标的使用，声音效果和碰撞检测等知识\n",
    "- [*第8章，着色器app*](kivy-ch8-shaders-app.html)介绍Kivy应用中如何GLSL着色器。这一章首先介绍OpenGL原始类型的概念，如索引和顶点，然后写出可以直接在GPU上运行代码，最后实现一个满天星屏保app\n",
    "- [*第9章，射击app*](kivy-ch9-shmup-app.html)延续上一章的内容，用GLSL着色器做游戏。首先实现一个可重用的粒子系统，然后通过粒子系统构建游戏角色。前面介绍过的许多内容在这个游戏中都会得到体现，如碰撞检测，触摸屏控制，声音效果等"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##环境设置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面简要介绍Kivy的安装方法，包括Mac，Linux和Windows系统。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###Python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Kivy同时支持Python2和Python3，不过本书的一些章节用到[Twisted](https://twistedmatrix.com/trac/)，目前还没有官方支持Python3。所有建议使用Python2.7。\n",
    "\n",
    ">许多平台不需要单独安装Python：比如Mac OS上自带Python2，Windows上和Kivy打包在一起，Linux（尤其是Ubuntu）支持`apt-get`安装。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###安装并运行Kivy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Kviy的最新稳定版本可以在[官方网站](http://kivy.org/)找到。如下图所示：\n",
    "\n",
    "![kivydownload](kbpic/0.1 kivydownload.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下载安装包后，具体平台安装方法可以看图中第三列指令，简要介绍如下：\n",
    "\n",
    "\n",
    "- Mac：\n",
    "    1. 打开命令行窗口\n",
    "    2. 执行`kivy`\n",
    "    3. Python提示符出现后输入`import kivy`\n",
    "    4. 如果安装顺利会出现`[INFO] Kivy v1.9.0`\n",
    "  \n",
    "  \n",
    "- Linux：\n",
    "    1. 打开命令行窗口\n",
    "    2. 执行`python`\n",
    "    3. Python提示符出现后输入`import kivy`\n",
    "    4. 如果安装顺利会出现`[INFO] Kivy v1.9.0`\n",
    "    \n",
    "    \n",
    "- Windows：\n",
    "    1. 双击**kivy.bat**文件\n",
    "    2. 执行`python`\n",
    "    3. Python提示符出现后输入`import kivy`\n",
    "    4. 如果安装顺利会出现`[INFO] Kivy v1.9.0`    \n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "运行Kivy应用很简单：\n",
    "\n",
    "- Mac上用`kivy main.py`\n",
    "- Linux上用`python main.py`\n",
    "- Windows上用`kivy.bat main.py`（或者把**main.py**拖到**kivy.bat**上运行）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##Hello, Kivy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面我们演示一个Kivy app的`hello world`版。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###代码"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "程序的入口是`main.py`，代码如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from kivy.app import App\n",
    "\n",
    "class HelloApp(App):\n",
    "    pass\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    HelloApp().run()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###布局"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "布局文件是应用类名的去掉`App`的小写部分加`.kv`，也就是`hello.kv`，代码如下所示：\n",
    "\n",
    "```yaml\n",
    "Label:\n",
    "    text: 'Hello, Kivy'\n",
    "```\n",
    "\n",
    "这里只用了一个Kivy标签部件`Label`，属性是`text`。布局文件用一种简洁、声明式的语言定义复杂的布局，后面会介绍。\n",
    "\n",
    "运行程序，看到的界面如下所示：\n",
    "\n",
    "![kivydownload](kbpic/0.2 hellokivy.png)\n",
    "\n",
    "下面就让我们开始Kivy之旅吧！Enjoy"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
